package com.linjiang.design.observe;

import java.util.ArrayList;
import java.util.List;

//观察者模式
//定义了对象之间的一对多依赖，让多个观察者对象同时监听某一个主题对象，当主题对象发生变化时，它的所有依赖者都会收到通知并更新
public class ObserveTest {
    public static void main(String[] args) {
        Subject subject = new Subject();
        Task1 task1 = new Task1();
        subject.addObServer(task1);
        Task2 task2 = new Task2();
        subject.addObServer(task2);

        subject.notifyObServer("信息数据");
        System.out.println("---------------");
        subject.removeObServer(task1);
        subject.notifyObServer("信息数据2");
    }
}

//主题
class Subject{
    //容器
    private List<ObServer> obServers = new ArrayList<>();
    //添加观察者
    public void addObServer(ObServer obServer){
        obServers.add(obServer);
    }
    //移除观察者
    public void removeObServer(ObServer obServer){
        obServers.remove(obServer);
    }

    //通知观察者
    public void notifyObServer(Object object){
        //遍历观察者列表
        for (ObServer obServer : obServers) {
            //调用观察者的更新方法
            obServer.update(object);
        }
    }
}

//观察者
interface ObServer{
    void update(Object object);
}

class Task1 implements ObServer{

    @Override
    public void update(Object object) {
        //收到通知，执行相应的更新逻辑
        System.out.println("Task1-received："+object);
    }
}

class Task2 implements ObServer{

    @Override
    public void update(Object object) {
        System.out.println("Task2-received："+object);
    }
}
